package com.train.common.utils;

import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;

public class FileUtils {

    public static String fileMD5(InputStream inputStream) throws IOException {
        try {
            // 创建 MessageDigest 实例，指定 MD5 算法
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 创建字节数组，用于读取文件数据
            byte[] buffer = new byte[1024];
            int numRead;

            // 读取文件数据，直到文件结束
            while ((numRead = inputStream.read(buffer)) != -1) {
                // 对读取的数据进行 MD5 加密
                md.update(buffer, 0, numRead);
            }

            // 将加密后的字节数组转换为十六进制字符串
            StringBuilder sb = byteToHex(md.digest());

            // 返回 MD5 哈希值
            return sb.toString();
        } catch (Exception e) {
            // 异常处理，根据需要进行调整
            throw new IOException("Error calculating MD5 hash", e);
        } finally {
            // 关闭输入流，确保资源被释放
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    // 可以记录日志或者忽略，根据需要进行处理
                }
            }
        }
    }

    // 辅助方法，用于将字节数组转换为十六进制字符串
    private static StringBuilder byteToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb;
    }
}